package Demo;

public class Demo01 {
    public static void main(String[] args) {
        /**
         * 数据类型转换6条规则：
         *      1.八中基本数据类型，除了布尔类型以外，其他7种基本数据类型均可转换
         *      2.小容量数据类型向大容量数据类型转换，属于自动类型转换，可直接转换
         *      3.大容量数据类型向小容量数据类型转换，属于强制类型转换，需要加强制类型转换符，并存在数据风险，可能会损失精度
         *      4.int类型向byte、short、char三种数据类型转换(赋值)时，不超过三种类型相应的取值空间，可直接转换(赋值)
         *      5.byte、short、char三种数据类型，在进行运算时，都先转换成int类型在进行运算。
         *      6.多种数据类型，进行混合运算时，各自先转换成占空间容量大的数据类型在进行混合运算，运算结果数据类型为占空间最大的数据类型。
         * */
        byte b1 = 10;
        byte b2 = 20;
        //报错 byte short char 进行运算时转换成int b1+b2 结果为int类型
        //byte b3 = b1 + b2;
        int b = b1 + b2;

        //*int类型是具体的值时，可以运算结束后直接赋值给未超过取值区间的byte、short、char，是变量时运算结束不能直接赋值。
        short s = 30+60+50+10000;
        char c1= 'a';
        //char c2 = c1 - 1; 错误 byte short char 进行运算时转换成int
        int c2 =c1 -1;

        long l = 1000L;
        //多种数据类型进行混合运算 各自先转换占空间大的数据类型 在进行运算，结果的数据类型为占空间大的数据类型
        long l1 = b1 + b2 + b +l;
        //自动数据类型转换
        long l2 = b1;
        //强制数据类型转换 可能会出现精度损失
        int l3 = (int)l1;

        byte s1 = 10, s2 = 20, s3;
        //s3 = s1 + s2; 报错 byte进行运算时 先变成int类型 不能直接赋值byte
        s3= 10 + 20;//先运算再赋值 运算完的结果 未超过byte取值区间

        int i1 = 10;
        int i2 = 20;
        //虽然int可直接对byte、short、char不超过各自取值区间直接赋值 但进行运算时 不能直接赋值。
        byte b3 = (byte)(i1 + 12);

        //精度损失案例
        int i3 = 1000;
        byte b5 = (byte)i3;
        //运行结果为 -24 并不是 最大值 127 强制类型转换就是直接卡掉多出的字节
        /*
         * 1000 二进制为 0011 1110 1000 转变为byte 的二进制  1110 1000 第一个1为负
         * 正数的原码 反码 补码都是一样的
         * 负数的原码反码补码 关系为 原码和反码 除了符号位 不变其他位置取反 反码和补码 是 补码=反码+1
         * 1110 1000是补码 变为反码为 1110 0111 变为编码为 1001 1000 结果为-24
         * 计算机中存补码形式
         *
         * 正数的原码=反码=补码
         * 负数的原码、反码与补码的转换关系是：原码取反=反码（符号位不变），反码+1=补码
         * */
        System.out.println(b5);
    }
}
